package com.herench.bs.transfer;

import org.apache.cxf.endpoint.Client;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 患者入院申请查询
 *
 * @author liuxiaohui
 * @date 2019/3/26
 */
public class GetAppointsInHosTransfer extends AbstractTransfer {
    public GetAppointsInHosTransfer(String method, Client client, String messageMethod) {
        super(method, client, messageMethod);
    }

    /**
     * 发送：微信前端JSON数据转换为HIS用的XML数据（微信前端==》HIS）
     * @param params
     * @return
     * @throws Exception
     */
    @Override
    public String toInvokeMessage(Map<String, Object> params) throws Exception {
        // 身份证号
        String idNo = (String) params.get("idNo");
        // 患者ID
        String patientId = (String) params.get("patientId");
        // 开始日期
        String startDate = (String) params.get("startDate");
        // 结束日期
        String endDate = (String) params.get("endDate");

        // 交易ID：his的方法名
        Document document = getTplDoc(getMethod());

        // 将各个入参数设值（入参==》XML）
        Element dataRow = document.getRootElement().element("CommitData").addElement("Data").addElement("DataRow");
        // 身份证号
        dataRow.addAttribute("ID_NO", idNo);
        // 患者ID
        dataRow.addAttribute("PATIENT_ID", patientId);
        // 开始日期
        dataRow.addAttribute("START_DATE", startDate);
        // 结束日期
        dataRow.addAttribute("END_DATE", endDate);

        return document.asXML();
    }

    /**
     * 接收：HIS返回的XML数据并转换为JSON（HIS==》微信前端）
     * @param resMsg
     * @return
     * @throws Exception
     */
    @Override
    public Map<String, Object> toResultMessage(String resMsg) throws Exception {
        Map<String, Object> resMap = new HashMap<>(16);
        Document document = DocumentHelper.parseText(resMsg);

        Element resultInfo = document.getRootElement().element("Result").element("Info");
        String executeStatus = resultInfo.attributeValue("EXECUTE_STATUS");
        String executeMessage = resultInfo.attributeValue("EXECUTE_MESSAGE");
        List<Map<String, Object>> dataList = new ArrayList<>();
        List<Map<String, Object>> dataRequireList = new ArrayList<>();

        if (Dialect.getSuccessfulState().equals(executeStatus)) {
            // 获取各个参数的值（出参的树状结构：父==》子）
            // 取得数据为数组形式
            List<Element> dataRowList = document.getRootElement().element("ReturnData").element("Data").elements();
            List<Element> dataRowRequireList = document.getRootElement().element("ReturnData").element("Require").elements();

            if (dataRowList == null || dataRowList.size() == 0) {
                resMap.put("code", "1403");
                resMap.put("message", "调用成功，但是获取的数据为 0 件！");
            } else {
                for (Element dataRow : dataRowList) {
                    Map<String, Object> subMap = new HashMap<>(16);
                    GetAppointsInHosInnerMessage innerMessage = new GetAppointsInHosInnerMessage(dataRow);

                    // 入院申请ID
                    subMap.put("hosAppId", innerMessage.getHosAppId());
                    // 患者ID
                    subMap.put("patientId", innerMessage.getPatientId());
                    // 入院次数
                    subMap.put("visitId", innerMessage.getVisitId());
                    // 身份
                    subMap.put("identity", innerMessage.getIdentity());
                    // 费别
                    subMap.put("chargeType", innerMessage.getChargeType());
                    // 患者姓名
                    subMap.put("patientName", innerMessage.getPatientName());
                    // 性别
                    subMap.put("sex", innerMessage.getSex());
                    // 出生日期
                    subMap.put("birthDate", innerMessage.getBirthDate());
                    // 身份证号
                    subMap.put("idNo", innerMessage.getIdNo());
                    // 出生地
                    subMap.put("birthPlace", innerMessage.getBirthPlace());
                    // 籍贯
                    subMap.put("nativePlace", innerMessage.getNativePlace());
                    // 婚姻状况
                    subMap.put("maritalStatus", innerMessage.getMaritalStatus());
                    // 国籍
                    subMap.put("citizenship", innerMessage.getCitizenship());
                    // 民族
                    subMap.put("nation", innerMessage.getNation());
                    // 通讯地址
                    subMap.put("mailingAddress", innerMessage.getMailingAddress());
                    // 邮政编码
                    subMap.put("zipCode", innerMessage.getZipCode());
                    // 联系电话
                    subMap.put("phoneNumber", innerMessage.getPhoneNumber());
                    // 联系人姓名
                    subMap.put("nextOfKin", innerMessage.getNextOfKin());
                    // 与联系人关系
                    subMap.put("relationship", innerMessage.getRelationship());
                    // 联系人地址
                    subMap.put("nextOfKinAddr", innerMessage.getNextOfKinAddr());
                    // 联系人电话
                    subMap.put("nextOfKinPhone", innerMessage.getNextOfKinPhone());
                    // 入院方式
                    subMap.put("patientClass", innerMessage.getPatientClass());
                    // 入院病情
                    subMap.put("patAdmCondition", innerMessage.getPatAdmCondition());
                    // 入院目的
                    subMap.put("admissionCause", innerMessage.getAdmissionCause());
                    // 押金金额
                    subMap.put("prepayment", innerMessage.getPrepayment());
                    // 入院科室编码
                    subMap.put("deptAddmissionTo", innerMessage.getDeptAddmissionTo());
                    // 入院科室名称
                    subMap.put("deptNameAddmissionTo", innerMessage.getDeptNameAddmissionTo());
                    // 门诊诊断
                    subMap.put("clinicDiagnosis", innerMessage.getClinicDiagnosis());
                    // 申请状态
                    subMap.put("appointStatus", innerMessage.getAppointStatus());
                    // 申请时间
                    subMap.put("appointDateTime", innerMessage.getAppointDateTime());
                    // 申请操作人
                    subMap.put("appointOperator", innerMessage.getAppointOperator());
                    // 取消申请时间
                    subMap.put("appointCancelDateTime", innerMessage.getAppointCancelDateTime());
                    // 取消申请操作人
                    subMap.put("appointCancelOperator", innerMessage.getAppointCancelOperator());
                    // 审批时间
                    subMap.put("checkDateTime", innerMessage.getCheckDateTime());
                    // 审批人
                    subMap.put("checkOperator", innerMessage.getCheckOperator());
                    // 申请状态名称
                    subMap.put("appointStatusName", innerMessage.getAppointStatusName());
                    // 审核未通过原因
                    subMap.put("checkNopassReason", innerMessage.getCheckNopassReason());
                    // 预计入院开始时间
                    subMap.put("admissionStartDate", innerMessage.getAdmissionStartDate());
                    // 预计入院结束时间
                    subMap.put("admissionEndDate", innerMessage.getAdmissionEndDate());
                    // 预计入院床位号
                    subMap.put("bedNo", innerMessage.getBedNo());
                    // 护理单元编码
                    subMap.put("wardCode", innerMessage.getWardCode());
                    // 护理单元名称
                    subMap.put("wardName", innerMessage.getWardName());
                    // 护理单元位置
                    subMap.put("deptLocation", innerMessage.getDeptLocation());


                    // 追加一行数据到List
                    dataList.add(subMap);
                }

                for (Element dataRow : dataRowRequireList) {
                    Map<String, Object> subMap = new HashMap<>(16);
                    GetAppointsInHosInnerMessage innerMessage = new GetAppointsInHosInnerMessage(dataRow);

                    // 入院申请ID
                    subMap.put("hosAppId", innerMessage.getHosAppId());
                    // 预约入院个性需求ID
                    subMap.put("appInHosRequireId", innerMessage.getAppInHosRequireId());
                    // 预约入院个性需求选项序号"
                    subMap.put("appInHosRequireOptionSeq", innerMessage.getAppInHosRequireOptionSeq());

                    // 追加一行数据到List
                    dataRequireList.add(subMap);
                }

                // 返回所有行数据
                resMap.put("dataList", dataList);
                resMap.put("dataRequireList", dataRequireList);

                // 返回Code
                resMap.put("code", executeStatus);
                // 返回信息
                resMap.put("message", "成功！");
            }
        } else {
            resMap.put("code", executeStatus);
            resMap.put("message", executeMessage);
        }
        return resMap;
    }

    public class GetAppointsInHosInnerMessage implements InnerMessage{
        /**
         * 入院申请ID
         */
        private String hosAppId;
        /**
         * 患者ID
         */
        private String patientId;
        /**
         * 入院次数
         */
        private String visitId;
        /**
         * 身份
         */
        private String identity;
        /**
         * 费别
         */
        private String chargeType;
        /**
         * 患者姓名
         */
        private String patientName;
        /**
         * 性别
         */
        private String sex;
        /**
         * 出生日期
         */
        private String birthDate;
        /**
         * 身份证号
         */
        private String idNo;
        /**
         * 出生地
         */
        private String birthPlace;
        /**
         * 籍贯
         */
        private String nativePlace;
        /**
         * 婚姻状况
         */
        private String maritalStatus;
        /**
         * 国籍
         */
        private String citizenship;
        /**
         * 民族
         */
        private String nation;
        /**
         * 通讯地址
         */
        private String mailingAddress;
        /**
         * 邮政编码
         */
        private String zipCode;
        /**
         * 联系电话
         */
        private String phoneNumber;
        /**
         * 联系人姓名
         */
        private String nextOfKin;
        /**
         * 与联系人关系
         */
        private String relationship;
        /**
         * 联系人地址
         */
        private String nextOfKinAddr;
        /**
         * 联系人电话
         */
        private String nextOfKinPhone;
        /**
         * 入院方式
         */
        private String patientClass;
        /**
         * 入院病情
         */
        private String patAdmCondition;
        /**
         * 入院目的
         */
        private String admissionCause;
        /**
         * 押金金额
         */
        private String prepayment;
        /**
         * 入院科室编码
         */
        private String deptAddmissionTo;
        /**
         * 入院科室名称
         */
        private String deptNameAddmissionTo;
        /**
         * 门诊诊断
         */
        private String clinicDiagnosis;
        /**
         * 申请状态
         */
        private String appointStatus;
        /**
         * 申请时间
         */
        private String appointDateTime;
        /**
         * 申请操作人
         */
        private String appointOperator;
        /**
         * 取消申请时间
         */
        private String appointCancelDateTime;
        /**
         * 取消申请操作人
         */
        private String appointCancelOperator;
        /**
         * 审批时间
         */
        private String checkDateTime;
        /**
         * 审批人
         */
        private String checkOperator;
        /**
         * 申请状态名称
         */
        private String appointStatusName;
        /**
         * 审核未通过原因
         */
        private String checkNopassReason;
        /**
         * 预计入院开始时间
         */
        private String admissionStartDate;
        /**
         * 预计入院结束时间
         */
        private String admissionEndDate;
        /**
             * 预计入院床位号
         */
        private String bedNo;
        /**
         * 护理单元编码
         */
        private String wardCode;
        /**
         * 护理单元名称
         */
        private String wardName;
        /**
         * 护理单元位置
         */
        private String deptLocation;

        /**
         * 预约入院个性需求ID
         */
        private String appInHosRequireId;
        /**
         * 预约入院个性需求选项序号
         */
        private String appInHosRequireOptionSeq;



        public GetAppointsInHosInnerMessage(Element element) {
            // 入院申请ID
            this.hosAppId = element.attributeValue("HOS_APP_ID");
            // 患者ID
            this.patientId = element.attributeValue("PATIENT_ID");
            // 入院次数
            this.visitId = element.attributeValue("VISIT_ID");
            // 身份
            this.identity = element.attributeValue("IDENTITY");
            // 费别
            this.chargeType = element.attributeValue("CHARGE_TYPE");
            // 患者姓名
            this.patientName = element.attributeValue("PATIENT_NAME");
            // 性别
            this.sex = element.attributeValue("SEX");
            // 出生日期
            this.birthDate = element.attributeValue("BIRTH_DATE");
            // 身份证号
            this.idNo = element.attributeValue("ID_NO");
            // 出生地
            this.birthPlace = element.attributeValue("BIRTH_PLACE");
            // 籍贯
            this.nativePlace = element.attributeValue("NATIVE_PLACE");
            // 婚姻状况
            this.maritalStatus = element.attributeValue("MARITAL_STATUS");
            // 国籍
            this.citizenship = element.attributeValue("CITIZENSHIP");
            // 民族
            this.nation = element.attributeValue("NATION");
            // 通讯地址
            this.mailingAddress = element.attributeValue("MAILING_ADDRESS");
            // 邮政编码
            this.zipCode = element.attributeValue("ZIP_CODE");
            // 联系电话
            this.phoneNumber = element.attributeValue("PHONE_NUMBER");
            // 联系人姓名
            this.nextOfKin = element.attributeValue("NEXT_OF_KIN");
            // 与联系人关系
            this.relationship = element.attributeValue("RELATIONSHIP");
            // 联系人地址
            this.nextOfKinAddr = element.attributeValue("NEXT_OF_KIN_ADDR");
            // 联系人电话
            this.nextOfKinPhone = element.attributeValue("NEXT_OF_KIN_PHONE");
            // 入院方式
            this.patientClass = element.attributeValue("PATIENT_CLASS");
            // 入院病情
            this.patAdmCondition = element.attributeValue("PAT_ADM_CONDITION");
            // 入院目的
            this.admissionCause = element.attributeValue("ADMISSION_CAUSE");
            // 押金金额
            this.prepayment = element.attributeValue("PREPAYMENT");
            // 入院科室编码
            this.deptAddmissionTo = element.attributeValue("DEPT_ADDMISSION_TO");
            // 入院科室名称
            this.deptNameAddmissionTo = element.attributeValue("DEPT_NAME_ADDMISSION_TO");
            // 门诊诊断
            this.clinicDiagnosis = element.attributeValue("CLINIC_DIAGNOSIS");
            // 申请状态
            this.appointStatus = element.attributeValue("APPOINT_STATUS");
            // 申请时间
            this.appointDateTime = element.attributeValue("APPOINT_DATE_TIME");
            // 申请操作人
            this.appointOperator = element.attributeValue("APPOINT_OPERATOR");
            // 取消申请时间
            this.appointCancelDateTime = element.attributeValue("APPOINT_CANCEL_DATE_TIME");
            // 取消申请操作人
            this.appointCancelOperator = element.attributeValue("APPOINT_CANCEL_OPERATOR");
            // 审批时间
            this.checkDateTime = element.attributeValue("CHECK_DATE_TIME");
            // 审批人
            this.checkOperator = element.attributeValue("CHECK_OPERATOR");
            // 申请状态名称
            this.appointStatusName = element.attributeValue("APPOINT_STATUS_NAME");
            // 审核未通过原因
            this.checkNopassReason = element.attributeValue("CHECK_NOPASS_REASON");
            // 预计入院开始时间
            this.admissionStartDate = element.attributeValue("ADMISSION_START_DATE");
            // 预计入院结束时间
            this.admissionEndDate = element.attributeValue("ADMISSION_END_DATE");
            // 预计入院床位号
            this.bedNo = element.attributeValue("BED_NO");
            // 护理单元编码
            this.wardCode = element.attributeValue("WARD_CODE");
            // 护理单元名称
            this.wardName = element.attributeValue("WARD_NAME");
            // 护理单元位置
            this.deptLocation = element.attributeValue("DEPT_LOCATION");

            // 预约入院个性需求ID
            this.appInHosRequireId = element.attributeValue("APP_IN_HOS_REQUIRE_ID");
            // 预约入院个性需求选项序号
            this.appInHosRequireOptionSeq = element.attributeValue("APP_IN_HOS_REQUIRE_OPTION_SEQ");
        }

        /**
         * 入院申请ID
         */
        public String getHosAppId() {
            return hosAppId;
        }
        /**
         * 患者ID
         */
        public String getPatientId() {
            return patientId;
        }
        /**
         * 入院次数
         */
        public String getVisitId() {
            return visitId;
        }
        /**
         * 身份
         */
        public String getIdentity() {
            return identity;
        }
        /**
         * 费别
         */
        public String getChargeType() {
            return chargeType;
        }
        /**
         * 患者姓名
         */
        public String getPatientName() {
            return patientName;
        }
        /**
         * 性别
         */
        public String getSex() {
            return sex;
        }
        /**
         * 出生日期
         */
        public String getBirthDate() {
            return birthDate;
        }
        /**
         * 身份证号
         */
        public String getIdNo() {
            return idNo;
        }
        /**
         * 出生地
         */
        public String getBirthPlace() {
            return birthPlace;
        }
        /**
         * 籍贯
         */
        public String getNativePlace() {
            return nativePlace;
        }
        /**
         * 婚姻状况
         */
        public String getMaritalStatus() {
            return maritalStatus;
        }
        /**
         * 国籍
         */
        public String getCitizenship() {
            return citizenship;
        }
        /**
         * 民族
         */
        public String getNation() {
            return nation;
        }
        /**
         * 通讯地址
         */
        public String getMailingAddress() {
            return mailingAddress;
        }
        /**
         * 邮政编码
         */
        public String getZipCode() {
            return zipCode;
        }
        /**
         * 联系电话
         */
        public String getPhoneNumber() {
            return phoneNumber;
        }
        /**
         * 联系人姓名
         */
        public String getNextOfKin() {
            return nextOfKin;
        }
        /**
         * 与联系人关系
         */
        public String getRelationship() {
            return relationship;
        }
        /**
         * 联系人地址
         */
        public String getNextOfKinAddr() {
            return nextOfKinAddr;
        }
        /**
         * 联系人电话
         */
        public String getNextOfKinPhone() {
            return nextOfKinPhone;
        }
        /**
         * 入院方式
         */
        public String getPatientClass() {
            return patientClass;
        }
        /**
         * 入院病情
         */
        public String getPatAdmCondition() {
            return patAdmCondition;
        }
        /**
         * 入院目的
         */
        public String getAdmissionCause() {
            return admissionCause;
        }
        /**
         * 押金金额
         */
        public String getPrepayment() {
            return prepayment;
        }
        /**
         * 入院科室编码
         */
        public String getDeptAddmissionTo() {
            return deptAddmissionTo;
        }
        /**
         * 入院科室名称
         */
        public String getDeptNameAddmissionTo() {
            return deptNameAddmissionTo;
        }
        /**
         * 门诊诊断
         */
        public String getClinicDiagnosis() {
            return clinicDiagnosis;
        }
        /**
         * 申请状态
         */
        public String getAppointStatus() {
            return appointStatus;
        }
        /**
         * 申请时间
         */
        public String getAppointDateTime() {
            return appointDateTime;
        }
        /**
         * 申请操作人
         */
        public String getAppointOperator() {
            return appointOperator;
        }
        /**
         * 取消申请时间
         */
        public String getAppointCancelDateTime() {
            return appointCancelDateTime;
        }
        /**
         * 取消申请操作人
         */
        public String getAppointCancelOperator() {
            return appointCancelOperator;
        }
        /**
         * 审批时间
         */
        public String getCheckDateTime() {
            return checkDateTime;
        }
        /**
         * 审批人
         */
        public String getCheckOperator() {
            return checkOperator;
        }
        /**
         * 申请状态名称
         */
        public String getAppointStatusName() {
            return appointStatusName;
        }
        /**
         * 审核未通过原因
         */
        public String getCheckNopassReason() {
            return checkNopassReason;
        }
        /**
         * 预计入院开始时间
         */
        public String getAdmissionStartDate() {
            return admissionStartDate;
        }
        /**
         * 预计入院结束时间
         */
        public String getAdmissionEndDate() {
            return admissionEndDate;
        }
        /**
         * 预计入院床位号
         */
        public String getBedNo() {
            return bedNo;
        }
        /**
         * 护理单元编码
         */
        public String getWardCode() {
            return wardCode;
        }
        /**
         * 护理单元名称
         */
        public String getWardName() {
            return wardName;
        }
        /**
         * 护理单元位置
         */
        public String getDeptLocation() {
            return deptLocation;
        }


        /**
         * 预约入院个性需求ID
         */
        public String getAppInHosRequireId() {
            return appInHosRequireId;
        }
        /**
         * 预约入院个性需求选项序号
         */
        public String getAppInHosRequireOptionSeq() {
            return appInHosRequireOptionSeq;
        }


    }
}
